import cv2
import mediapipe as mp
import time

cap=cv2.VideoCapture(0)#初始化摄像头，0 表示使用默认摄像头（通常是笔记本电脑的内置摄像头或第一个外接摄像头
import mediapipe as mp#加载 MediaPipe 的手部检测模块

cap=cv2.VideoCapture(0)
mpHands=mp.solutions.hands
hands=mpHands.Hands()#创建一个手部检测对象，用于处理图像并检测手部关键点
mpDraw=mp.solutions.drawing_utils#加载 MediaPipe 的绘图工具，用于在图像上绘制检测到的关键点和连接线
pTime=0
cTime=0

while True:
    ret,img=cap.read()#从摄像头读取一帧图像。ret 是一个布尔值，表示是否成功读取图像，img 是读取到的图像。
    if ret:
        imgRGB=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)#将图像从 BGR 颜色空间转换为 RGB 颜色空间，因为 MediaPipe 的模型需要 RGB 格式的图像
        result=hands.process(imgRGB)#使用手部检测模型处理图像，返回检测结果
        #print(result.multi_hand_landmarks)#打印手的坐标
        imgHeight=img.shape[0]
        imgWidth=img.shape[1]
        if result.multi_hand_landmarks:#使用手部检测模型处理图像，返回检测结果
            for handLms in result.multi_hand_landmarks:#遍历检测到的每只手的关键点
                mpDraw.draw_landmarks(img, handLms,mpHands.HAND_CONNECTIONS)#在图像上绘制手部关键点和连接线。
                for i, lm in enumerate(handLms.landmark):#i是第几个点，lm是点的坐标
                    xPos=int(lm.x*imgWidth)
                    yPos=int(lm.y*imgHeight)
                    #将第几个点的标签写在图上
                    #cv2.putText(img,str(i),(xPos-25,yPos+25),cv2.FONT_HERSHEY_SIMPLEX,(0.4),(0,0,255),2)
                    if i==4:
                        cv2.circle(img,(xPos,yPos),20,(255,0,0),cv2.FILLED)#画圆圈，放大4点
                    print(i,xPos,yPos)

        #计算fps
        cTime=time.time()#现在的时间
        fps=1/(cTime-pTime)
        pTime=cTime
        #帧率写在图上
        cv2.putText(img,f"FPS:{int(fps)}",(50,50),cv2.FONT_HERSHEY_SIMPLEX,1,255)
        cv2.imshow('img',img)#显示处理后的图像
    if cv2.waitKey(1)  == ord('q'):#如果按下 q 键，退出循环，结束程序
        break

